package com.share.shareplatform.sharelogistics;

import com.share.shareplatform.sharelogistics.dao.OrderDao;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;

public class ShareLogistics {
    /*
    *
    * 模拟物流
    *
    * */
    public static void main(String[] args) throws IOException, InterruptedException {
        String resource = "mybatis-config.xml";
        InputStream resourceAsStream = Resources.getResourceAsStream(resource);
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
		/*
		SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在，没有任何理由丢弃它或重新创建另一个实例。
		使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次，
		多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。
		最简单的就是使用单例模式或者静态单例模式。
		 */
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
		/*
		每个线程都应该有它自己的 SqlSession 实例。
		SqlSession 的实例不是线程安全的，因此是不能被共享的每个线程都应该有它自己的 SqlSession 实例。
		 */
        HashMap<Integer,String> hashMap=new HashMap<Integer,String>();
        mapInit(hashMap);

        int i=4;
        while(true){
            SqlSession sqlSession = sqlSessionFactory.openSession();
            OrderDao orderDao = sqlSession.getMapper(OrderDao.class);
            int flag = orderDao.updateAllByState(hashMap.get(i),hashMap.get(i+1));
            System.out.println("状态从"+hashMap.get(i)+"=>"+hashMap.get(i+1)+",一共更改了"+flag+"条数据");
            sqlSession.commit();//不用此句，数据库中是不会改变的
            i--;
            if(i==0){
                i=4;
                Thread.sleep(1000*60);
            }
        }

    }
    public static void mapInit(HashMap<Integer,String> hashMap){
        hashMap.put(1,"待发货");
        hashMap.put(2,"待收货");
        hashMap.put(3,"使用中");
        hashMap.put(4,"待返还");
        hashMap.put(5,"已返还");
    }
}
